/**
 * ZHU framework. Copyright 2012-, all rights reserved.
 *
 * $Id: WebContext.java 12 2012-07-27 08:48:07Z zhuxiaopeng $
 * $Revision: 12 $
 * $Date: 2012-07-27 16:48:07 +0800 (五, 2012-07-27) $
 * $Author: zhuxiaopeng $
 */
package zhu.framework.web;

import java.util.logging.*;

import zhu.framework.util.*;

/**
 * <p>
 * </p>
 * 
 * @author $Author: zhuxiaopeng $
 * @version $Revision: 12 $ - $Date: 2012-07-27 16:48:07 +0800 (五, 2012-07-27) $
 */
public abstract class WebContext {
	static private Logger getLogger() {
		final Logger logger = LoggerManager.getInstance().getLogger(WebContext.class);
		return logger;
	}

	public static synchronized WebContext getInstance() {
		return instance;
	}

	/**
	 * <p>
	 * 現在のThreadが処理しているリクエストが属するセッション情報を取得する。
	 * </p>
	 * 
	 * @return
	 */
	abstract public WebSessionContext getSessionContext();

	/**
	 * <p>
	 * 現在のThreadが処理しているリクエストのコンテキスト情報を取得する。
	 * </p>
	 * 
	 * @return 現在のThreadが処理しているリクエストのコンテキスト情報
	 */
	abstract public WebRequestContext getRequestContext();

	static public synchronized void initInstance(final WebContext webContxt) {
		MyUtility.checkMethodParameterNotNull("clientContxt", webContxt);
		final Logger logger = getLogger();
		if (instance != null) {
			if (logger.isLoggable(Level.WARNING)) {
				logger.warning("Re-initializing WebContext : This message should not appear in production run");
			}
		}
		if (logger.isLoggable(Level.INFO)) {
			logger.info(String.format("WebContext is initialize with %s", webContxt));
		}
		instance = webContxt;
	}

	private static WebContext instance;
}
